#ifndef SDL_JOUEUR_INCLUDED
#define SDL_JOUEUR_INCLUDED

#include <SDL/SDL.h>

#define HAUT 0
#define BAS 1
#define GAUCHE 2
#define DROITE 3
#define ECHOBJ 4
#define RAMOBJ 5
#define TIRHAUT 6
#define TIRBAS 7
#define TIRGAUCHE 8
#define TIRDROITE 9

/**
 * \file SDL_Joueur.h
 * \brief Configuration des controles
 * \author Nathanaël Desjobert
 * \date 04 Juin 2013
 *
 * Module de l'interface SDL pour la gestion des actions du joueur.
 *
 */

/********************************************//**
 * \enum controle
 * \brief Type de controle
 * Types de dispositions défini dans le fichier de configuration
 ***********************************************/
typedef enum{CLAVIER,MANETTE,SOURIS} controle;

/********************************************//**
 * \struct SDL_Joueur
 * \brief Action personnalisé d'un joueur
 * Evenement généré en fonction des entrées
 ***********************************************/
typedef struct
{
    controle c;/**< Type de controle */
    SDL_Joystick *j;/**< Pointeur vers le joystick ouvert en sdl */
    int key[TIRDROITE+1];/**< Les touches du clavier */
    int axesjoy[4];/**< Les axes de joysticks */
    float timerech;/**< Timer */
    float timerreq;/**< Timer */

} SDL_Joueur;

/********************************************//**
 * \brief Constructeur de SDL_joueur
 *
 * \param [in,out] S La config Joueur à initialiser
 * Charge le fichier "data/config.src"
 ***********************************************/
void initSDL_Joueur(SDL_Joueur* S);

/********************************************//**
 * \brief Evenement Haut
 *
 * \param [in] S La config Joueur
 * \param [in] keystates Tableau renvoyé par SDL_GetKeystates
 * \return 1: evenement 0: pas d'evenement
 *
 ***********************************************/
int evenementhautSDL_Joueur(const SDL_Joueur* S, const Uint8 * keystates);

/********************************************//**
 * \brief Evenement Bas
 *
 * \param [in] S La config Joueur
 * \param [in] keystates Tableau renvoyé par SDL_GetKeystates
 * \return 1: evenement 0: pas d'evenement
 *
 ***********************************************/
int evenementbasSDL_Joueur(const SDL_Joueur* S, const Uint8 * keystates);

/********************************************//**
 * \brief Evenement Gauche
 *
 * \param [in] S La config Joueur
 * \param [in] keystates Tableau renvoyé par SDL_GetKeystates
 * \return 1: evenement 0: pas d'evenement
 *
 ***********************************************/
int evenementgaucheSDL_Joueur(const SDL_Joueur* S, const Uint8 * keystates);

/********************************************//**
 * \brief Evenement Bas
 *
 * \param [in] S La config Joueur
 * \param [in] keystates Tableau renvoyé par SDL_GetKeystates
 * \return 1: evenement 0: pas d'evenement
 *
 ***********************************************/
int evenementdoiteSDL_Joueur(const SDL_Joueur* S, const Uint8 * keystates);

/********************************************//**
 * \brief Evenement de tir
 *
 * \param [in] S La config Joueur
 * \param [in] event L'event renvoyé par SDL_PollEvent
 * \param [in] keystates Tableau renvoyé par SDL_GetKeystates
 * \param [in,out] angle L'angle à tirer si l'evenement a lieu
 * \param [in] x Coordonnée sur l'ecran du joueur
 * \param [in] y Coordonnée sur l'ecran du joueur
 * \return 1: evenement 0: pas d'evenement
 *
 ***********************************************/
int evenementtirSDL_Joueur(const SDL_Joueur* S,const SDL_Event * event, const Uint8 * keystates,float * angle,int x, int y);

/********************************************//**
 * \brief Evenement de changement d'objet
 *
 * \param [in] S La config Joueur
 * \param [in] event L'event renvoyé par SDL_PollEvent
 * \return 1: evenement 0: pas d'evenement
 *
 ***********************************************/
int evenementechangobjetSDL_Joueur(SDL_Joueur* S,const SDL_Event * event);

/********************************************//**
 * \brief Evenement de rammassage d'objet
 *
 * \param [in] S La config Joueur
 * \param [in] event L'event renvoyé par SDL_PollEvent
 * \return 1: evenement 0: pas d'evenement
 *
 ***********************************************/
int evenementrammobjetSDL_Joueur(SDL_Joueur* S,const SDL_Event * event);

/********************************************//**
 * \brief Destructeur de SDL_Joueur
 *
 * \param [in,out] S SDL_Joueur à detruire
 *
 ***********************************************/
void detruireSDL_Joueur(SDL_Joueur* S);


#endif // SDL_JOUEUR_INCLUDED
